home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 001-025 / scopedisk24 / qrt14src / precomp.c < prev    next >
C/C++ Source or Header  |  1995-03-18  |  3KB  |  142 lines

  1. /**********************************************************
  2.  
  3.    Contains pre-computing routines for objects.  This
  4.    is to get as much as possible out of the way so that
  5.    the line/object intersection routines don't have to
  6.    do it.  Pre-computed stuff is stored in the objects
  7.    precomp sub-structure.
  8.  
  9.  **********************************************************/
  10.  
  11. #include "qrt.h"
  12.  
  13. /* #define PRECOMPDEBUG */
  14.  
  15.  
  16. /**********************************************************
  17.  
  18.                    Precompute sphere
  19.  
  20.   Computes : n1 = sqr(radius);
  21.  
  22.  **********************************************************/
  23.  
  24. PreCompSphere(obj)
  25.   OBJ_PTR obj;
  26. {
  27.  
  28. # ifdef ROBUST
  29.     if (obj->type != SPHERE) Error(INTERNAL_ERROR,901);
  30. # endif
  31.  
  32.   obj->precomp.n1 = sqr(obj->vect1.x);
  33.  
  34. }
  35.  
  36.  
  37. /**********************************************************
  38.  
  39.                    Precompute Planar object
  40.  
  41.   Computes : norm   = vect1 X vect2
  42.              n1     = Dotprod (norm,loc)
  43.              len1   = | VECT1 |
  44.              len2   = | VECT2 |
  45.  
  46.  **********************************************************/
  47.  
  48. PreCompPlane(obj)
  49.   OBJ_PTR obj;
  50. {
  51.  
  52. # ifdef ROBUST
  53.     if (!((obj->type == PARALLELOGRAM) ||
  54.           (obj->type == TRIANGLE)      ||
  55.           (obj->type == RING)))
  56.       Error(INTERNAL_ERROR,902);
  57. # endif
  58.  
  59.   CrossProd(&(obj->precomp.norm),&(obj->vect1),&(obj->vect2));
  60.   Normalize(&(obj->precomp.norm));
  61.  
  62.   obj->precomp.n1 = DotProd((obj->precomp.norm),(obj->loc));
  63.  
  64.   obj->precomp.len1 = DotProd(obj->vect1,obj->vect1);
  65.   obj->precomp.len2 = DotProd(obj->vect2,obj->vect2);
  66.  
  67. }
  68.  
  69.  
  70. /**********************************************************
  71.  
  72.                    Precompute Quadratic
  73.  
  74.  **********************************************************/
  75.  
  76. PreCompQuadratic(obj)
  77.   OBJ_PTR obj;
  78. {
  79.  
  80.   VECTOR newdir;
  81.  
  82. # ifdef ROBUST
  83.     if (obj->type != QUADRATIC) Error(INTERNAL_ERROR,903);
  84. # endif
  85.  
  86.   Normalize(&(obj->vect1));
  87.  
  88.   if ((obj->vect1.x!=0) || (obj->vect1.z !=0)) {
  89.     obj->precomp.cos1 = obj->vect1.z /
  90.                         sqrt(sqr(obj->vect1.x) + sqr(obj->vect1.z));
  91.  
  92.     obj->precomp.sin1 = sqrt(1 - sqr(obj->precomp.cos1));
  93.   } else {
  94.     obj->precomp.cos1 =
  95.     obj->precomp.sin1 = 0;
  96.   }
  97.  
  98.   /* find new direction after first rotation */
  99.  
  100.   newdir.x = obj->vect1.x *  obj->precomp.cos1 +
  101.              obj->vect1.z * -obj->precomp.sin1;
  102.  
  103.   newdir.y = obj->vect1.y;
  104.  
  105.   newdir.z = obj->vect1.x * obj->precomp.sin1 +
  106.              obj->vect1.z * obj->precomp.cos1;
  107.  
  108.   /* now do second rotation */
  109.  
  110.   if ((newdir.y!=0) || (newdir.z !=0)) {
  111.     obj->precomp.cos2 = newdir.y /
  112.                         sqrt(sqr(newdir.y) + sqr(newdir.z));
  113.  
  114.     obj->precomp.sin2 = sqrt(1 - sqr(obj->precomp.cos2));
  115.   } else {
  116.     obj->precomp.cos2 =
  117.     obj->precomp.sin2 = 0;
  118.   }
  119.  
  120. # ifdef PRECOMPDEBUG
  121.   printf("PRECOMPQUADRATIC: cos1,sin1 = %f %f\n",
  122.           obj->precomp.cos1,obj->precomp.sin1);
  123.  
  124.   printf("                  cos2,sin2 = %f %f\n",
  125.           obj->precomp.cos2,obj->precomp.sin2);
  126. # endif
  127.  
  128. }
  129.  
  130.  
  131. /**********************************************************
  132.  
  133.       Null precomputing routine for all other objects
  134.  
  135.  **********************************************************/
  136.  
  137. PreCompNull(obj)
  138.   OBJ_PTR obj;
  139. {
  140. }
  141.  
  142.